package com.example.aigc_education.utils;

import com.example.aigc_education.constant.CacheConstants;
import com.example.aigc_education.constant.UserConstants;
import com.example.aigc_education.exception.*;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
@Component
public class LoginUtils {

    @Resource
    private RedisCache redisCache;


    /**
     * 校验验证码的合法性。
     *
     * @param username 用户名，用户名用于标识验证码的所属用户，但本方法不直接使用该参数进行校验。
     * @param code 用户输入的验证码。
     * @param uuid 验证码的唯一标识，用于从缓存中获取对应的验证码进行校验。
     * @throws RuntimeException 当验证码为空时抛出。
     * @throws CaptchaExpireException 当验证码已过期时抛出。
     * @throws CaptchaException 当验证码不正确时抛出。
     */
    public void validateCaptcha(String username, String code, String uuid)  {
        if(code == null){
            throw new RuntimeException("验证码不能为空");
        }
        //构造验证码key(uuid不为空才能返回)
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid,"");
        //从redis中获取验证码
        String captcha = redisCache.getCacheObject(verifyKey);
        //获取之后再redis中删除验证码
        redisCache.deleteObject(verifyKey);
        //验证码超时
        if (captcha==null){
            throw new CaptchaExpireException();
        }
        //验证码不正确
        if (!code.equalsIgnoreCase(captcha)){
            throw new CaptchaException();
        }
    }


    /**
     * 登录前的预检查
     *
     * @param username 用户名
     * @param password 密码
     * @throws UserNotExistsException 如果用户名或密码为空
     * @throws UserPasswordNotMatchException 如果密码长度不符合规定或用户名长度不符合规定
     */
    public void loginPreCheck(String username, String password) {
        //用户名或密码为空
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            throw new UserNotExistsException();
        }
        //密码长度不符合规定
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
            throw new UserPasswordNotMatchException();
        }
        //用户名长度不符合规定
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
            throw new UsernameNotMatchException();
        }
    }

}
